package com.wxh.producerconsumer.synchronizedcodeblock;

import java.util.List;
import java.util.Random;

/**
 * @ClassName: ProducerThread
 * @Description: 生成者线程
 * @Author wxh
 * @Date: 2021/12/7 9:57
 * @Version V1.0.0
 * @Since 1.8
 */
public class ProducerThread implements Runnable {
    /**
     *  存储数据集合
     */
    private List<Integer> list;

    /**
     * 初始化数据
     * @param list
     */
    public ProducerThread(List<Integer> list){
        this.list = list;
    }

    @Override
    public void run() {
        while(true){
            Random random = new Random();
            synchronized(list){
                // 表明集合中有元素，此线程等待
                while(list.size() > 0){
                    // 因为生产者线程有多个，当本线程wait之后，假如一个生产者线程得到锁(本该消费者得到)，
                    // 如果是if，那么此线程就会继续执行，会导致数据错乱。
                    // 如果是while则会继续等待。
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // 添加一个随机数，0-99的随机数
                list.add(random.nextInt(100));
                System.out.println(Thread.currentThread().getName() + " " + list.get(0));
                // 通知消费者，集合中已有元素
                // 唤醒此对象锁所有等待线程(消费者和生产者线程均有)
                list.notifyAll();
            }
        }
    }
}
